import os
import sys

# 添加项目根目录到Python路径
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir))
sys.path.append(project_root)

from config_reader import get_bailian_config
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_PROJECT"] = "ChatBoxCase"
os.environ["LANGCHAIN_API_KEY"] = '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'

# 从配置文件获取百炼配置
bailian_config = get_bailian_config()
bailian_api_token = bailian_config['token']

# 聊天机器人案例
# 创建模型（使用阿里云百炼）
model = ChatOpenAI(
    model='qwen-plus',
    openai_api_key=bailian_api_token,
    openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# 准备测试数据 ，假设我们提供的文档数据如下：
documents = [Document(page_content="狗是伟大的伴侣，以其忠诚和友好而闻名。", metadata={"source": "哺乳动物宠物文档"}, ),
    Document(page_content="猫是独立的宠物，通常喜欢自己的空间。", metadata={"source": "哺乳动物宠物文档"}, ),
    Document(page_content="金鱼是初学者的流行宠物，需要相对简单的护理。", metadata={"source": "鱼类宠物文档"}, ),
    Document(page_content="鹦鹉是聪明的鸟类，能够模仿人类的语言。", metadata={"source": "鸟类宠物文档"}, ),
    Document(page_content="兔子是社交动物，需要足够的空间跳跃。", metadata={"source": "哺乳动物宠物文档"}, ), ]

# 实例化一个向量数空间（使用阿里云百炼Embedding）
vector_store = Chroma.from_documents(documents, embedding=OpenAIEmbeddings(
    openai_api_key=bailian_api_token,
    openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="text-embedding-v4"
))

# 相似度的查询: 返回相似的分数， 分数越低相似度越高
print(vector_store.similarity_search_with_score('咖啡猫'))

# 检索器: bind(k=1) 返回相似度最高的第一个
# retriever = RunnableLambda(vector_store.similarity_search).bind(k=1)

# print(retriever.batch(['咖啡猫', '鲨鱼']))


# # 提示模板
# message = """
# 使用提供的上下文仅回答这个问题:
# {question}
# 上下文:
# {context}
# """
#
# prompt_temp = ChatPromptTemplate.from_messages([('human', message)])
#
# # RunnablePassthrough允许我们将用户的问题之后再传递给prompt和model。
# chain = {'question': RunnablePassthrough(), 'context': retriever} | prompt_temp | model
#
# resp = chain.invoke('请介绍一下猫？')
#
# print(resp.content)
